#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
/*
    判断负环的思路就是看看每次去跟新我们的dis那么说明此时
    有更小的出现了一定是权值为负但是我们一共就n个点
    如果大于等于n并且跟新了说明一定有多余的边
    因为n个点最多有n-1边    
*/
int n,m;
bool st[N];
int dis[N],cnt[N];
queue<int>q;
struct edge
{
    int w;
    int to;
    int next;
}edges[N];
int ind;
int head[N];
void add(int u,int v,int w)
{
    edges[ind].w=w;
    edges[ind].to=v;
    edges[ind].next=head[u];
    head[u]=ind++;
}
bool spfa()
{
    //这里我们不用初始化我们的dist因为我们只要进行距离减小就行
    for(int i=1;i<=n;i++)
    {
        q.push(i);
        st[i]=true;
    }
    while(q.size())
    {
        int t=q.front();
        q.pop();
        st[t]=false;//t这个点如果被跟新跟小的值也可以入队进行再次更新

        for(int i=head[t];i!=-1;i=edges[i].next)
        {
            int j=edges[i].to;
            if(dis[t]+edges[i].w<dis[j])
            {
                dis[j]=dis[t]+edges[i].w;
                cnt[j]=cnt[t]+1;
                if(cnt[j]>=n) return true;
                if(!st[j])
                {
                    q.push(j);
                    st[j]=true;
                }
            }
        }
    }
    return false;
}

int main()
{
    memset(head,-1,sizeof(head));
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
    }
    if(spfa())
    {
        cout<<"Yes"<<endl;
    }
    else
    {
        cout<<"No"<<endl;
    }
}
